package com.king.juc.syncmode;

/**
 * 保护对象
 * @author king
 * @date 2020/11/5 15:15
 */
public class GuardedObjectV2 {

    /**
     * 标识
     */
    private Integer id;

    public GuardedObjectV2(Integer id) {
        this.id = id;
    }

    public Integer getId() {
        return id;
    }

    /**
     * 结果
     */
    private Object response;

    /**
     * 获取结果
     */
    public Object get() {
        synchronized (this) {
            // 没有结果
            while (null == response){
                try {
                    this.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            return response;
        }
    }


    /**
     * 获取结果
     *      类似 join()
     */
    public Object getByTimeOut(long time) {
        synchronized (this) {
            // 开始时间
            long begin = System.currentTimeMillis();
            // 等待时间
            long passedTime = 0L;

            // 没有结果
            while (null == response){

                // 判断最大等待时间
                if(passedTime >= time){
                    // 退出循环
                    break;
                }

                try {
                    this.wait(time -= passedTime);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                passedTime = System.currentTimeMillis() - begin;
            }
            return response;
        }
    }

    /**
     * 产生结果
     */
    public void complete(Object response) {
        synchronized (this) {
            this.response = response;
            this.notifyAll();
        }
    }
}
